#pragma once

#include <cstdint>
#include <string>
#include <unordered_map>
#include <memory>
#include <mutex>
#include "user.hpp"

using namespace std;


class Session
{
public:
    Session(uint64_t user_id, uint64_t sid,bool stu)
        : _user_id(user_id),
          _islogin(stu),
          _session_id(sid)
    {
    }
    void SetisLogin(bool stu)
    {
        _islogin=stu;
        //同步修改用户登录状态
        guser_table.SetisLogin(_user_id,stu);
    }
    bool isLogin()
    {
        return _islogin;
    }
    uint64_t SessionId()
    {
        return _session_id;
    }

private:
    uint64_t _user_id;
    bool _islogin; // 是否处于登录状态
    uint64_t _session_id;
};

class SessionTable
{
public:
    SessionTable()
    {
        srand((uint32_t)time(nullptr));
    }
    uint64_t GetSession()//随机生成一个session--简略算法
    {
        uint id=rand()*rand();
        return id;
    }

    bool isExistence(const uint64_t id)
    {
        lock_guard<mutex> lock(_m);
        if (_table.find(id) == _table.end()) // Session对象不存在
        {
            return false;
        }
        return true;
    }

    bool AddSession(const uint64_t id, const Session &s)
    {
        lock_guard<mutex> lock(_m);

        if (_table.find(id) != _table.end()) // Session对象不存在才能插入
        {
            return false;
        }

        _table.insert({id, make_shared<Session>(s)});

        return true;
    }
    bool DleteSession(const uint64_t id)
    {
        lock_guard<mutex> lock(_m);

        if (_table.find(id) == _table.end()) // Session对象存在才能删除
        {
            return false;
        }
        _table.erase(id);
        return true;
    }
    bool isLogin(const uint64_t id) // 判断指定用户是否登录
    {
        lock_guard<mutex> lock(_m);

        if (_table.find(id) == _table.end()) // Session对象不存在也视为没有登录
        {
            return false;
        }

        return _table[id]->isLogin();
    }

    bool SetisLogin(const uint64_t id,const bool stu) //修改用户登录状态
    {
        lock_guard<mutex> lock(_m);

        if (_table.find(id) == _table.end())
        {
            return false;
        }

        _table[id]->SetisLogin(stu);

        return true;
    }
private:
    unordered_map<uint64_t, shared_ptr<Session>> _table;//sessionid和session的映射
    mutex _m;
};


SessionTable gsession_table;

